// const fn1 = () => {
//     setTimeout(() => {
//         console.log(1);
//     }, 2000);
// }

// const fn2 = () => {
//     setTimeout(() => {
//         console.log(2);
//     }, 1000);
// }

// const fn3 = () => {
//     console.log(3);
// }

//无论顺序如何，输出顺序都不会变
// fn1();
// fn2();
// fn3();

//ES5写法：callback回调
// 缺点：回调低于，可读性差
// const fn1 = (cb) => {
//     setTimeout(() => {
//         console.log(1);
//         setTimeout(() => {
//             console.log(2);
//             fn3();
//         }, 1000);

//     }, 2000);
// }

// const fn2 = (cb) => {
//     setTimeout(() => {
//         console.log(2)
//         if (cb) cb();
//     }, 1000);
// }

// const fn3 = () => {
//     console.log(3);
// }

// fn1(fn2(fn3));

// fn1();

//ES6 Promise写法
const p1 = new Promise((resolve, b) => {
    setTimeout(() => {
        console.log(1);
        resolve();
    }, 2000)
});

const p2 = new Promise((resolve, b) => {
    setTimeout(() => {
        console.log(2);
        resolve();
    }, 1000)
});

const fn3 = () => {
    console.log(3);
};

// p1.then(
//     () => {
//         P2.then(() => {
//             fn3
//         })
//     }
// );


//async await (异步函数)  ES8  语法糖

const mainFn = async () => {
    await p1;
    await p2;
    fn3();
}

mainFn();